/**
 * @author luguoxiang
 * @Date: 2023/8/21 16:55
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
function isNotNumber(v: string | number) {
  return v === null || v === undefined || v === '' || isNaN(v);
}

/**
 * 表达式运算
 * @param expression 表达式
 */
export function calc(expression: any) {
  const func = Function;
  return new func(`return ${expression}`)();
}

/**
 * 加法（为null的项按0处理）
 * @param args
 */
export function add(...args: number[]) {
  let result = 0;
  for (const arg of args) {
    result += Number(arg ?? 0);
  }
  return result;
}

/**
 * 减法
 * @param args
 */
export function sub(...args: number[]) {
  let result = 0;
  for (const arg of args) {
    result -= Number(arg ?? 0);
  }
  return result;
}

/**
 * 乘法（任意一项为null结果为null）
 * @param args
 */
export function mul(...args: number[]) {
  let result = 1;
  for (const arg of args) {
    if (isNotNumber(arg)) {
      return null;
    }
    result *= Number(arg);
  }
  return result;
}

/**
 * 除法（任意一项为null结果为null）
 * @param divisor
 * @param args
 */
export function div(divisor: any, ...args: number[]) {
  if (isNotNumber(divisor) || args.length === 0) {
    return null;
  }
  let result = Number(divisor);
  for (const arg of args) {
    if (isNotNumber(arg)) {
      return null;
    }
    result /= Number(arg);
  }
  return result;
}
/**
 * 精确到小数点后x位（注意因js原因整数加小数的有效数字只有15位）
 * @param num 数值
 * @param precision 精度
 */
export function round(num: number, precision = 10) {
  precision = 10 ** precision;
  return Math.round(num * precision) / precision;
}
